package com.Fh_learner.String;

/*
1） String是一个final类，代表不可变的字符序列
2) 字符串是不可变的，一个字符串对象一旦被分配，其内容不可变
*/
public class StringExercise01 {
    public static void main(String[] args) {
        //问题1：创建了几个对象
        String a = "hello"+"abc";
        System.out.println(a);
        //解析：
        //第一眼看下去可能会觉得是3个对象（hello、abc和helloabc）
        //如果这么看的话，你就太小瞧底层的优化了，
        // 1. 此优化首先判断创建的常量池对象，是否有引用指向
        // 2. 如果有那就会被存入字符串的常量池，如果没有的话呢，就会被舍弃
        // 3. 显然是有变量a的，那么就会被存入常量池，接下来编译器做底层优化，直接 ——> String a = "helloabc"

        //问题2：创建了几个对象
        String b = "hello";
        String c = "abc";
        String d = b+c;
        System.out.println(d);
        //一共三个对象，这与上述并不相同，此处引用了变量来存储这些字符串常量
        //分析：
        //通过debug可以查看整个执行的流程
        //1. 先创建了一个StringBuilder sb = new StringBuilder();
        //2. 执行sb.append("hello");
        //3. 执行sb.append("abc");
        //4. String d = sb.toString();
        //最后d其实是指向堆中的对象(String) value[] 指向-> 池中的"helloabc"

        //总结：常量相加，看的是池，辩来辩那个相加，是在堆中


    }
}
